前面說了那麼多,今天就來聊一聊ROP的經典技巧ret2csu,在早期的編譯器,__libc_csu_init
基本上都會存在,有了這個函式,我們會有更多可利用的gadgets可以使用,我們可以利用這個函式設定參數來拿到shell
__libc_csu_init
,是一個在早期的編譯器都會被自動編譯進去的function(現在沒有了),它的功能主要是init libc
我們可以清楚看到 __libc_csu_init
內部有許多 pop rxx
指令 的組合:
rbx, rbp, r12, r13, r14, r15
六個暫存器都控制住。rdi, rsi, rdx
,並且最終呼叫 [r12 + rbx*8]
指向的函數位址。這代表什麼呢?
這代表我們能夠透過精心設計的 ROP chain,藉由這段現成的初始化程式碼,來完成一次「任意函數呼叫」。
換句話說,__libc_csu_init
幫我們準備好了一個萬用的呼叫器 (universal caller):
r12
。r13, r14, r15
,就能對應到 rdi, rsi, rdx
。